package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.product.mapper.SkuAttrValueMapper;
import com.atguigu.gmall.product.mapper.SpuSaleAttrMapper;
import com.atguigu.gmall.product.model.*;
import com.atguigu.gmall.product.service.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author terminal
 * @since 2023-06-09 10:38
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class SkuMangeServiceImpl implements SkuMangeService {
    @Resource
    private SkuInfoService skuInfoService;
    @Resource
    private SkuImageService skuImageService;
    @Resource
    private SpuImageService spuImageService;
    @Resource
    private SkuAttrValueService skuAttrValueService;
    @Resource
    private SkuSaleAttrValueService skuSaleAttrValueService;

    /**
     * 根据spuId 获取spuImage 集合
     *
     * @param spuId
     * @return
     */
    @Override
    public List<SpuImage> getSpuImageList(Long spuId) {
        LambdaQueryWrapper<SpuImage> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SpuImage::getSpuId, spuId);
        return spuImageService.list(queryWrapper);
    }

    /**
     * 保存SkuInfo
     *
     * @param skuInfo
     * @return
     */
    @Override
    public void saveSkuInfo(SkuInfo skuInfo) {
        if (skuInfo.getId() == null) {
            skuInfoService.save(skuInfo);
            Long skuId = skuInfo.getId();
            List<SkuImage> skuImageList = skuInfo.getSkuImageList();
            // SkuImage
            if (!CollectionUtils.isEmpty(skuImageList)) {
                skuImageList.stream().forEach(skuImage -> skuImage.setSkuId(skuId));
                skuImageService.saveBatch(skuImageList);
            }
            // SkuAttrValue
            List<SkuAttrValue> skuAttrValueList = skuInfo.getSkuAttrValueList();
            if (!CollectionUtils.isEmpty(skuAttrValueList)) {
                skuAttrValueList.stream().forEach(skuAttrValue -> skuAttrValue.setSkuId(skuId));
                skuAttrValueService.saveBatch(skuAttrValueList);
            }

            // SkuSaleAttrValue
            List<SkuSaleAttrValue> skuSaleAttrValueList = skuInfo.getSkuSaleAttrValueList();
            if (!CollectionUtils.isEmpty(skuSaleAttrValueList)) {
                skuSaleAttrValueList.stream().forEach(skuSaleAttrValue -> {
                    skuSaleAttrValue.setSkuId(skuId);
                    skuSaleAttrValue.setSpuId(skuInfo.getSpuId());
                });
                skuSaleAttrValueService.saveBatch(skuSaleAttrValueList);
            }
        } else {
            System.out.println("修改");
        }
    }

    /**
     * 分页查询商品SKU列表
     *
     * @param skuInfoPage
     * @param category3Id
     * @return
     */
    @Override
    public Page<SkuInfo> getSkuByPage(Page<SkuInfo> skuInfoPage, Long category3Id) {
        LambdaQueryWrapper<SkuInfo> queryWrapper = new LambdaQueryWrapper<>();
        if (category3Id != null) {
            queryWrapper.eq(SkuInfo::getCategory3Id, category3Id);
        }
        queryWrapper.orderByDesc(SkuInfo::getUpdateTime);
        return skuInfoService.page(skuInfoPage, queryWrapper);
    }

    /**
     * 上架
     *
     * @param skuId
     * @return
     */
    @Override
    public void onSale(Long skuId) {
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId(skuId);
        skuInfo.setIsSale(1);
        skuInfoService.updateById(skuInfo);
    }

    /**
     * 下架
     *
     * @param skuId
     * @return
     */
    @Override
    public void cancelSale(Long skuId) {
        LambdaUpdateWrapper<SkuInfo> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(SkuInfo::getIsSale, 0);
        updateWrapper.eq(SkuInfo::getId, skuId);
        skuInfoService.update(updateWrapper);
    }

}
